package matse11.LSpielProject;

import matse11.LSpielProject.Operator;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import android.view.View;

public class SpielView extends View {

	// variablen dec
	final int dim = 480;// px
	final int aFieldDim = 480 / 4;
	final int toTop = 32;

	final int inTop = 520;
	final int inDim = 204;
	final int inAField = inDim / 3;
	final int inRight = 138;

	private int myX = 0;
	private int myY = 0;

	private Spiel spiel = null;

	private String error = "";

	private OnTouchListener touch = new OnTouchListener() {
		@Override
		public boolean onTouch(View arg0, MotionEvent arg1) {
			// TODO Auto-generated method stub
			myX = (int) arg1.getX();
			myY = (int) arg1.getY();
			if (myY <= dim + toTop && myY >= toTop) {
				myY -= toTop;
				myX = myY / aFieldDim;
				myY = (int) arg1.getX() / aFieldDim;

				short[][] feld = spiel.getFeld();
				short[][] akfeld = spiel.getAkFeld();
				if (feld[myX][myY] < 0) {
					if (Logik.moeglicherZug(feld, akfeld)) {
						if (spiel.getAkSpieler().getLStein()) {
							spiel.erstelleNeuesFeld();
							spiel.setzeNStein(myX, myY);
							spiel.getAkSpieler().setLStein(false);
						}else{
							error = "Es darf nur 1 N Stein bewegt werden.";
						}
					} else {
						error = "L-Stein kann hier nicht gesetzt werden.";
					}
				} else {
					error = "Bitte einen Neutralen Stein auswaehlen.";
				}

			}

			if (myY <= inTop + inDim && myY >= inTop && myX >= inRight
					&& myX <= inRight + inDim) {
				myX = (int) ((arg1.getY() - inTop) / inAField);
				myY = (int) ((arg1.getX() - inRight) / inAField);
				short[][] lfeld = spiel.getAkFeld();
				if (myX == 0) {
					if (myY == 0 && spiel.getAkSpieler().getLStein()) {
						Operator.dreheLinks(lfeld);
					} else if (myY == 1) {
						Operator.bewege(lfeld, 0, -1);
					} else {
						if (spiel.getAkSpieler().getLStein()) {
							Operator.dreheRechts(lfeld);
						}
					}
				} else if (myX == 1) {
					if (myY == 0) {
						Operator.bewege(lfeld, -1, 0);
					} else if (myY == 1) {
						if (spiel.getAkSpieler().getLStein()) {
							if (Logik.moeglicherZug(spiel.getFeld(), lfeld)) {
								spiel.erstelleNeuesFeld();
								spiel.pruefeGewinn();
								spiel.naechsterSpieler();
							} else {
								error = "Bitte L-Stein bewegen!";
							}
						} else {
							if (Logik.moeglicherZugNStein(spiel.getFeld(),
									lfeld)) {
								spiel.erstelleNeuesFeld();
								spiel.pruefeGewinn();
								spiel.naechsterSpieler();
							} else {
								error = "Zug nicht moeglich.";
							}
						}

					} else {
						Operator.bewege(lfeld, 1, 0);
					}
				} else {
					if (myY == 0 && spiel.getAkSpieler().getLStein()) {
						Operator.spiegleVe(lfeld);
					} else if (myY == 1) {
						Operator.bewege(lfeld, 0, 1);
					} else {
						if (spiel.getAkSpieler().getLStein()) {
							Operator.spiegleHo(lfeld);
						}
					}
				}
			}
			invalidate();
			// invalidate(new Rect(0, 0, dim, toTop + dim));
			return false;
		}
	};

	public SpielView(Context context, Spiel pspiel) {
		super(context);
		this.spiel = pspiel;
		this.setOnTouchListener(touch);
	}

	@Override
	protected void onDraw(Canvas c) {
		super.onDraw(c);

		Paint paint = new Paint();

		// method connntent
		paint.setStyle(Paint.Style.FILL);

		// zeichne den geasammtenhintergrund schwarz
		paint.setColor(Color.BLACK);
		c.drawPaint(paint);

		// zeichne das spielfeld bg:
		paint.setColor(Color.rgb(236, 225, 179));
		c.drawRect(0, toTop, dim, toTop + dim, paint);
		// linien
		paint.setColor(Color.DKGRAY);
		for (int i = 0; i < 4; i++) {
			c.drawLine(aFieldDim * i, toTop, aFieldDim * i, toTop + dim, paint);
			c.drawLine(0, toTop + aFieldDim * i, dim, toTop + aFieldDim * i,
					paint);
		}

		if (spiel != null) {
			short akSpieler = (short) (spiel.getZug() % 2);
			if (akSpieler == 0) {
				akSpieler = 2;
			}
			short[][] feld = spiel.getFeld();
			paint.setColor(Color.LTGRAY);
			for (int i = 0; i < feld.length; i++) {
				for (int j = 0; j < feld.length; j++) {
					if (feld[i][j] > 0
							&& (feld[i][j] != akSpieler || !spiel
									.getAkSpieler().getLStein())) {
						c.drawRect(aFieldDim * j, toTop + aFieldDim * i,
								aFieldDim * (j + 1), toTop + aFieldDim
										* (i + 1), paint);
					} else if (feld[i][j] < 0) {
						c.drawCircle(aFieldDim * j + aFieldDim / 2, aFieldDim
								* i + aFieldDim / 2 + toTop, aFieldDim / 2 - 5,
								paint);
					}
				}
			}
			short[][] nfeld = spiel.getAkFeld();
			if (akSpieler == 1) {
				paint.setColor(Color.rgb(241, 111, 6));
				System.out.println("sp1");
			} else {
				paint.setColor(Color.rgb(158, 231, 38));
			}
			for (int i = 0; i < feld.length; i++) {
				for (int j = 0; j < feld.length; j++) {
					if (nfeld[i][j] > 0) {
						c.drawRect(aFieldDim * j, toTop + aFieldDim * i,
								aFieldDim * (j + 1), toTop + aFieldDim
										* (i + 1), paint);
					} else if (nfeld[i][j] < 0) {
						c.drawCircle(aFieldDim * j + aFieldDim / 2, aFieldDim
								* i + aFieldDim / 2 + toTop, aFieldDim / 2 - 5,
								paint);
					}
				}
			}
		}

		/*
		 * paint.setColor(Color.YELLOW); c.drawText("Pos: " + myX + " X " + myY,
		 * 0, toTop, paint);
		 */
		paint.setColor(Color.BLACK);
		c.drawRect(inRight, inTop, inRight + inDim, inTop + inDim, paint);

		// pfeile zeichnen
		boolean ecken = spiel.getAkSpieler().getLStein();
		Resources res = this.getContext().getResources();
		Drawable image = res.getDrawable(R.drawable.links);
		image.setBounds(inRight + 1, inTop + inAField + 1, inRight + inAField
				- 1, inTop + inAField * 2 - 1);
		image.draw(c);

		// oben
		image = res.getDrawable(R.drawable.oben);
		image.setBounds(inRight + inAField + 1, inTop + 1, inRight + inAField
				* 2 - 1, inTop + inAField - 1);
		image.draw(c);

		// rechts
		image = res.getDrawable(R.drawable.rechts);
		image.setBounds(inRight + inAField * 2 + 1, inTop + inAField + 1,
				inRight + inAField * 3 - 1, inTop + inAField * 2 - 1);
		image.draw(c);

		// unten
		image = res.getDrawable(R.drawable.unten);
		image.setBounds(inRight + inAField + 1, inTop + inAField * 2 + 1,
				inRight + inAField * 2 - 1, inTop + inAField * 3 - 1);
		image.draw(c);

		// links drehen
		if (ecken) {
			image = res.getDrawable(R.drawable.linksdrehen);
			image.setBounds(inRight + 1, inTop + 1, inRight + inAField - 1,
					inTop + inAField - 1);
			image.draw(c);
		}
		// rechts drehen
		if (ecken) {
			image = res.getDrawable(R.drawable.rechtsdrehen);
			image.setBounds(inRight + inAField * 2 + 1, inTop + 1, inRight
					+ inAField * 3 - 1, inTop + inAField - 1);
			image.draw(c);
		}
		// spiegel 1
		if (ecken) {
			image = res.getDrawable(R.drawable.spiegelho);
			image.setBounds(inRight + 1, inTop + inAField * 2 + 1, inRight
					+ inAField - 1, inTop + inAField * 3 - 1);
			image.draw(c);
		}
		// spiegel 1
		if (ecken) {
			image = res.getDrawable(R.drawable.spiegelve);
			image.setBounds(inRight + inAField * 2 + 1, inTop + inAField * 2
					+ 1, inRight + inAField * 3 - 1, inTop + inAField * 3 - 1);
			image.draw(c);
		}
		// mitte
		paint.setColor(Color.rgb(158, 185, 240));
		c.drawRect(inRight + inAField + 2, inTop + inAField + 2, inRight
				+ inAField * 2 - 2, inTop + inAField * 2 - 2, paint);
		paint.setColor(Color.BLACK);
		paint.setTextSize(20);
		c.drawText("OK!", inRight + inAField * 1.25f + 2, inTop + inAField
				* 1.6f + 2, paint);

		// zeichne linien
		paint.setColor(Color.BLACK);
		for (int i = 0; i < 3; i++) {
			c.drawLine(inRight + inAField * i, inTop, inRight + inAField * i,
					inTop + inDim, paint);
			c.drawLine(inRight, inTop + inAField * i, inRight + inDim, inTop
					+ inAField * i, paint);
		}

		if (error.length() > 0) {
			paint.setColor(Color.RED);
			paint.setTextSize(25);
			c.drawText(error, 0, toTop - 5, paint);
			error = "";
		}
	}
}
